package es.deusto.ingenieria.tesoroaventurero;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import es.deusto.ingenieria.is.formulation.State;


public class Utilidades {

	private ArrayList<State> estadosFinales;
	private ArrayList<Casilla> arrayGemas;
	
    public List<Point> ordenarMejorado( List<Point> gemas) {
		 int pasadas = 0;
		 int comparaciones = 0;
		 boolean hayCambios = true;
		 for (int i = 0; hayCambios ; i++) {
		     ++pasadas;
		     hayCambios = false;
		     for (int j = 0; j < gemas.size() - 1; j++) {
				  ++comparaciones;
				  if ((gemas.get(j).x + gemas.get(j).y) > (gemas.get(j+1).x + gemas.get(j+1).y)) {
				      intercambiar(gemas, j, j+1);
				      hayCambios = true;
				  }
		     }
		 }
		 return gemas;
    }
    

    private void intercambiar(List<Point> arreglo, int a, int b) {
		 Point tmp = arreglo.get(a);
		 arreglo.set(a, arreglo.get(b));
		 arreglo.set(b, tmp);
    }
    
    public ArrayList<State> crearArrayEstadosFinales(EscenarioXMLReader xml) {
		arrayGemas = xml.getGemas();
		Personaje p = new Personaje();
		p = xml.getPersonaje();
		estadosFinales = new ArrayList<State>();
		for (int i=0; i<arrayGemas.size(); i=i+0) {
			Casilla gema = new Casilla();
			gema = cogerGemaMasCercana(p);
			p = new Personaje();
			p.setLocation(gema.x, gema.y);
			estadosFinales.add(crearEstadoFinal(xml, p));
		}
		Personaje p5 = new Personaje();
		p5.setLocation(xml.getTesoro());
		estadosFinales.add(crearEstadoFinal(xml, p5));
		return estadosFinales;
	}
    
    public State crearEstadoFinal(EscenarioXMLReader xml, Personaje p) {
		Escenario e = new Escenario(xml.getCasillas(), xml.getTesoro(), xml.getGemas());
		e.setPersonaje(p);
		return new State(e);
	}

	public Casilla cogerGemaMasCercana(Personaje p) {
		int posicion = 0;
		Casilla casilla = new Casilla();
		Casilla casilla2;
		for (int i=0; i<arrayGemas.size(); i++) {
			if (i != 0) {
				casilla2 = arrayGemas.get(i);
				if (esMasCercana(casilla2, casilla, p)) {
					casilla = arrayGemas.get(i);
					posicion = i;
				}
			}
			else {
				casilla = arrayGemas.get(i);
				posicion = i;
			}
		}
		arrayGemas.remove(posicion);
		return casilla;
	}

	public boolean esMasCercana(Casilla cas1, Casilla cas2, Personaje p) {
		if ((Math.abs(cas1.x - p.x) + Math.abs(cas1.y - p.y)) < (Math.abs(cas2.x - p.x) + Math.abs(cas2.y - p.y))) {
			return true;
		}
		else {
			return false;
		}
	}
}
